import datetime
import os.path
import sys

import numpy as np
import pandas as pd
from common import common


class Getdata:
    def __init__(self, zd):
        self.zd = zd
        self.flag = False  # 标记是否获取数据成功

    def getds(self):
        df1 = self.data1()  # 获取原表数据
        df2 = self.data2()  # 获取月数据汇总表数据
        df3 = self.data3()  # 获取原条码数据
        df4 = self.data4()  # 获取C类数据
        df5 = self.data5()  # 获取返修转退运表数据
        df6 = self.data6()  # 获取子库基表中的返修转退运表数据
        if self.flag:
            return None

        dfs = df1.merge(df2, on='退货订单号', how='left')

        dfs['匹配C类条码'] = dfs['物料条码'].isin(df3['原条码'])
        dfs = dfs.merge(df4, on='描述', how='left')
        condition = (dfs['匹配C类条码'] == True) & (dfs['货位_y'].notna())
        dfs.loc[condition, '货位_x'] = dfs.loc[condition, '货位_y']
        dfs.rename(columns={'货位_x': '货位'}, inplace=True)
        dfs.drop(['货位_y'], axis=1, inplace=True)

        dfs = dfs.merge(df5, on='物料条码', how='left')
        dfs['返修退运子库货位'] = dfs['描述'] + dfs['返修退运子库货位']
        dfs = dfs.merge(df6, on='返修退运子库货位', how='left')
        dfs.loc[dfs['备注'] == '返修转退运', '无匹配标识'] = dfs.loc[dfs['备注'] == '返修转退运', '返修退运货位']
        dfs.loc[dfs['无匹配标识'].notna(), '货位'] = dfs.loc[dfs['无匹配标识'].notna(), '无匹配标识']
        dfs.loc[dfs['备注'] == '返修转退运', '无匹配标识'] = [None if v is not np.NaN else '无匹配' for v in
                                                              dfs.loc[dfs['备注'] == '返修转退运', '无匹配标识']]
        dfs.drop(['返修退运子库货位', '返修退运货位'], axis=1, inplace=True)
        dfs['ICARE子库'] = dfs['货位'].str.replace('HQ0*', 'HQ0D2-')
        dfs = dfs[
            ['退货订单号', '物料编码', '物料条码', '物料描述', '数量', '子库', '货位', '无匹配标识', '子库货位描述',
             '物料编号', '条码年月', '条码长度', '编码匹配', '描述', '转出子库', '转出货位', '转入子库', '转入货位',
             '备注', '匹配C类条码', 'ICARE子库']]
        if dfs.empty:
            common.show_message('没有获取到月数据汇总表数据', 0)
            return None
        else:
            IH2 = dfs.loc[
                dfs['子库'].str.startswith('IH2'), ['子库', '货位', '物料编码', '物料描述', '转出子库', '转出货位',
                                                    '转入子库', '转入货位', '数量', '退货订单号']]
            SS4 = dfs.loc[
                dfs['子库'].str.startswith(('SS4','BS')), ['子库', '货位', '物料编码', '物料描述', '转出子库', '转出货位',
                                                    '转入子库', '转入货位', '数量', '退货订单号']]
            HK = dfs.loc[
                dfs['子库'].str.startswith('HK'), ['子库', '货位', '物料编码', '物料描述', '转出子库', '转出货位',
                                                   '转入子库', '转入货位', '数量', '退货订单号']]
            IH2_1 = pd.DataFrame()
            IH2_2 = pd.DataFrame()
            SS4_1 = pd.DataFrame()
            SS4_2 = pd.DataFrame()
            HK_1 = pd.DataFrame()
            HK_2 = pd.DataFrame()
            if not IH2.empty:
                # 提账单
                df_IH2_1 = IH2[['物料编码', '物料描述', '转出子库', '转出货位', '转入子库', '转入货位', '数量',
                                '退货订单号']].copy()
                df_IH2_1['退货数量'] = df_IH2_1['数量']
                df_IH2_1.rename(columns={'数量': '实收数量'}, inplace=True)
                IH2_1 = pd.pivot_table(df_IH2_1,
                                       index=['物料编码', '物料描述', '转出子库', '转出货位', '转入子库', '转入货位',
                                              '退货订单号'], values=['实收数量', '退货数量'],
                                       aggfunc='sum').reset_index()
                IH2_1 = IH2_1[
                    ['物料编码', '物料描述', '转出子库', '转出货位', '转入子库', '转入货位', '实收数量', '退货数量',
                     '退货订单号']]

                # 转账单
                df_IH2_2 = IH2[
                    ['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位', '数量', '退货订单号']].copy()
                IH2_2 = pd.pivot_table(df_IH2_2, index=['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位',
                                                        '退货订单号'], values=['数量'], aggfunc='sum').reset_index()
                IH2_2 = IH2_2[['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位', '数量', '退货订单号']]

            if not SS4.empty:
                # 提账单
                df_SS4_1 = SS4[['物料编码', '物料描述', '转出子库', '转出货位', '转入子库',
                                '转入货位', '数量', '退货订单号']].copy()
                df_SS4_1['退货数量'] = df_SS4_1['数量']
                df_SS4_1.rename(columns={'数量': '实收数量'}, inplace=True)
                SS4_1 = pd.pivot_table(df_SS4_1,
                                       index=['物料编码', '物料描述', '转出子库', '转出货位', '转入子库', '转入货位',
                                              '退货订单号'],
                                       values=['实收数量', '退货数量'], aggfunc='sum').reset_index()
                SS4_1 = SS4_1[['物料编码', '物料描述', '转出子库', '转出货位', '转入子库',
                               '转入货位', '实收数量', '退货数量', '退货订单号']]
                # 转账单
                df_SS4_2 = SS4[
                    ['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位', '数量', '退货订单号']].copy()
                SS4_2 = pd.pivot_table(df_SS4_2,
                                       index=['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位',
                                              '退货订单号'],
                                       values=['数量'], aggfunc='sum').reset_index()
                SS4_2 = SS4_2[['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位', '数量', '退货订单号']]

            if not HK.empty:
                # 提账单
                df_HK_1 = HK[['物料编码', '物料描述', '转出子库', '转出货位', '转入子库',
                              '转入货位', '数量', '退货订单号']].copy()
                df_HK_1['退货数量'] = df_HK_1['数量']
                df_HK_1.rename(columns={'数量': '实收数量'}, inplace=True)
                HK_1 = pd.pivot_table(df_HK_1,
                                      index=['物料编码', '物料描述', '转出子库', '转出货位', '转入子库', '转入货位',
                                             '退货订单号'],
                                      values=['实收数量', '退货数量'], aggfunc='sum').reset_index()
                HK_1 = HK_1[['物料编码', '物料描述', '转出子库', '转出货位', '转入子库',
                             '转入货位', '实收数量', '退货数量', '退货订单号']]
                # 转账单
                df_HK_2 = HK[
                    ['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位', '数量', '退货订单号']].copy()
                HK_2 = pd.pivot_table(df_HK_2,
                                      index=['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位',
                                             '退货订单号'],
                                      values=['数量'], aggfunc='sum').reset_index()
                HK_2 = HK_2[['物料编码', '物料描述', '转入子库', '转入货位', '子库', '货位', '数量', '退货订单号']]

            path = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), '结果')
            common.create_folder_if_not_exists(path)
            spath = os.path.join(path, f'月数据汇总表{datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')}.xlsx')

            with pd.ExcelWriter(spath) as writer:
                dfs.to_excel(writer, sheet_name='汇总表', index=False)
                IH2_1.to_excel(writer, sheet_name='IH2提货单', index=False)
                HK_1.to_excel(writer, sheet_name='HK提货单', index=False)
                SS4_1.to_excel(writer, sheet_name='SS4提货单', index=False)
                IH2_2.to_excel(writer, sheet_name='IH2转库单', index=False)
                HK_2.to_excel(writer, sheet_name='HK转库单', index=False)
                SS4_2.to_excel(writer, sheet_name='SS4转库单', index=False)

    # 获取原表数据
    def data1(self):
        df = pd.read_excel(self.zd['z1'], sheet_name='待入库信息',
                           usecols=['退货订单号', '物料编码', '物料条码', '物料描述', '数量', '子库', '货位',
                                    '子库货位描述'])
        if df.empty:
            self.flag = True
            common.show_message('没有获取到原表数据', 0)
            return None
        df['物料编号'], df['条码年月'], df['条码长度'] = zip(*df['物料条码'].apply(self.process_material_code))
        df['编码匹配'] = df['物料编码'] == df['物料编号']
        df['描述'] = df['子库货位描述'].str.extract(r'(R\d{1})')
        df['描述'] = df['子库'] + df['描述']
        return df

    def process_material_code(self, item):
        if len(item) == 20:
            return item[2:10], item[12:13], 20
        elif len(item) == 16:
            return '03' + item[:6], item[8:9], 16
        else:
            return '', '', 0

    # 获取月数据汇总表数据
    def data2(self):
        df = pd.read_excel(self.zd['z4'], sheet_name='Sheet1',
                           usecols=['箱单号', '转出子库', '转出货位', '转入子库', '转入货位', '备注'])
        if df.empty:
            self.flag = True
            common.show_message('没有获取到月数据汇总表数据', 0)
            return None
        df.rename(columns={'箱单号': '退货订单号'}, inplace=True)
        df['备注'].fillna('', inplace=True)
        return df

    # 获取原条码数据
    def data3(self):
        df = pd.read_excel(self.zd['z3'], sheet_name='Sheet1', usecols=['原条码','新条码'])
        if df.empty:
            self.flag = True
            common.show_message('没有获取到原条码数据', 0)
            return None
        df=df.astype(str)
        if df['新条码'].notnull().any():
            lists = list(set(df['原条码'].tolist() + df['新条码'].tolist()))
            new_df = pd.DataFrame({'原条码': lists})
            return new_df
        return df

    # 获取C类数据
    def data4(self):
        df = pd.read_excel(self.zd['z2'], sheet_name='C类', usecols=['子库', '子库货位描述', '货位'])
        if df.empty:
            self.flag = True
            common.show_message('没有获取到C类数据', 0)
            return None
        df['描述'] = df['子库货位描述'].str.extract(r'(R\d{1})')
        df['描述'] = (df['子库'] + df['描述']).drop_duplicates()
        df = df[['描述', '货位']]
        df.drop_duplicates(subset=['描述', '货位'], inplace=True)
        return df

    # 获取返修转退运数据
    def data6(self):
        df = pd.read_excel(self.zd['z2'], sheet_name='返修转退运', usecols=['ERP子库&退库货位', 'ERP货位'])
        if df.empty:
            self.flag = True
            common.show_message('没有获取到返修转退运数据', 0)
            return None
        df.rename(columns={'ERP子库&退库货位': '返修退运子库货位', 'ERP货位': '返修退运货位'}, inplace=True)
        return df

    # 获取返修转退运表数据
    def data5(self):
        df = pd.read_excel(self.zd['z5'], sheet_name='Sheet1', usecols=['条码/SN', '维修结论/Repair Result'])
        if df.empty:
            self.flag = True
            common.show_message('没有获取到返修退运表数据', 0)
            return None
        # 对列名重命名
        df.rename(columns={'条码/SN': '物料条码', '维修结论/Repair Result': '返修退运子库货位'}, inplace=True)
        df['返修退运子库货位'] = df['返修退运子库货位'].str.extract(r'入(.*?)货位')
        return df
